/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package econutri.util;

import java.io.File;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

/**
 *
 * @author Leonardo Oliveira Moreira
 */
public class Utils {

    private static final Locale BRAZIL = new Locale("pt", "BR");
    private static final DecimalFormatSymbols REAL = new DecimalFormatSymbols(BRAZIL);
    private static final DecimalFormat DINHEIRO_REAL = new DecimalFormat("###,###,##0.00", REAL);

    public static String treatValue(double value) {
        return DINHEIRO_REAL.format(value);
    }

    public static String treatValue(String value) {
        double doubleValue = Double.parseDouble(value);
        return treatValue(doubleValue);
    }

    public static String getDataAtual() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        return sdf.format(new Date());
    }

    public static Double formatDoubleValue(Double value) {
        Double comSysNumber = value;
        NumberFormat f = NumberFormat.getInstance();
        f.setGroupingUsed(false);
        String refinedNumber = f.format(comSysNumber);
        refinedNumber = refinedNumber.replaceAll(",", ".");
        return Double.parseDouble(refinedNumber);
    }

    public static String converterDataSQL(String data) {
        String result = "";
        SimpleDateFormat sdfIn = new SimpleDateFormat("dd/MM/yyyy");
        SimpleDateFormat sdfOut = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date dtResult = sdfIn.parse(data);
            result = sdfOut.format(dtResult);
        } catch (ParseException ex) {
            
        }
        return result;
    }

    private Utils() {
        
    }

    public static double getCalorias(Double carboidrato, Double proteina, Double lipidio) {
        double kcal = 0;
        kcal = ((carboidrato + proteina) * 4) + (lipidio * 9);
        kcal = (Math.round((kcal * 100.0))) / 100.0;
        return kcal;
    }

    public static double getCalorias(Double quantidade, Double carboidrato, Double proteina, Double lipidio) {
        double kcal = 0;
        kcal = ((carboidrato + proteina) * 4) + (lipidio * 9);
        kcal = (Math.round((kcal * quantidade)) / quantidade);
        return kcal;
    }

    public static String treatToString(String param) {
        param = treatString(param);
        if (param != null && param.trim().length() > 0) {
            return param.trim().toUpperCase();
        }
        return "";
    }

    public static Boolean treatToBoolean(String param) {
        if (param != null && param.trim().length() > 0 && param.trim().equalsIgnoreCase("true")) {
            return new Boolean(true);
        }
        return new Boolean(false);
    }

    public static Double treatToDouble(String param) {
        if (param != null && param.trim().length() > 0) {
            return new Double(param.trim().toUpperCase()).doubleValue();
        }
        return null;
    }

    public static Long treatToLong(String param) {
        if (param != null && param.trim().length() > 0) {
            return new Long(param.trim().toUpperCase()).longValue();
        }
        return null;
    }

    public static String treatInterface(Long param) {
        if (param == null) {
            return "";
        } else {
            return String.valueOf(param).trim().toUpperCase();
        }
    }

    public static String treatInterface(String param) {
        param = treatString(param);
        if (param == null) {
            return "";
        } else {
            return param.trim().toUpperCase();
        }
    }

    public static String treatInterface(Double param) {
        if (param == null) {
            return "";
        } else {
            return String.valueOf(param).trim().toUpperCase();
        }
    }

    public static String treatInterface(Boolean param) {
        if (param == null) {
            return "";
        } else {
            String result = "Sim";
            if (param == null || param == false) {
                result = "Não";
            }
            return result;
        }
    }

    public static String treatInterface(Date param) {
        if (param == null) {
            return "";
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            String resultado = "";
            resultado = sdf.format(param);
            return resultado.trim().toUpperCase();
        }
    }

    public static String treatSQLToString(String param) {
        if (param != null && param.trim().length() > 0) {
            return "%" + param.trim().toUpperCase() + "%";
        }
        return "%";
    }

    public static Long treatSQLToLong(Object param) {
        if (param != null && param instanceof String && String.valueOf(param).trim().length() > 0) {
            return new Long(String.valueOf(param).trim().toUpperCase()).longValue();
        } else if (param != null && param instanceof Long) {
            return Long.parseLong(String.valueOf(param));
        }
        return -1L;
    }

    public static Date treatSQLToDate(String param) {
        if (param != null && param.trim().length() > 0) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            Date resultado;
            try {
                resultado = sdf.parse(param.trim().toUpperCase());
            } catch (ParseException ex) {
                return null;
            }
            return resultado;
        }
        return null;
    }

    public static Date treatToDate(String param) {
        if (param != null && param.trim().length() > 0) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            Date resultado;
            try {
                resultado = sdf.parse(param.trim().toUpperCase());
            } catch (ParseException ex) {
                return null;
            }
            return resultado;
        }
        return null;
    }

    public static void setRequestAttribute(HttpServletRequest request, String key, String value) {
        if (value != null && value.trim().length() > 0) {
            request.setAttribute(key, value.trim().toUpperCase());
        } else {
            request.setAttribute(key, "");
        }
    }

    /**
     * Calcula a diferença de duas datas em dias
     * <br>
     * <b>Importante:</b> Quando realiza a diferença em dias entre duas datas, este método considera as horas restantes e as converte em fração de dias.
     * @param dataInicial
     * @param dataFinal
     * @return quantidade de dias existentes entre a dataInicial e dataFinal.
     */
    public static double diferencaEmDias(Date dataInicial, Date dataFinal) {
        double result = 0;
        long diferenca = dataFinal.getTime() - dataInicial.getTime();
        double diferencaEmDias = (diferenca / 1000) / 60 / 60 / 24; //resultado é diferença entre as datas em dias
        long horasRestantes = (diferenca / 1000) / 60 / 60 % 24; //calcula as horas restantes
        result = diferencaEmDias + (horasRestantes / 24d); //transforma as horas restantes em fração de dias
        return result;
    }

    /**
     * Calcula a diferença de duas datas em horas
     * <br>
     * <b>Importante:</b> Quando realiza a diferença em horas entre duas datas, este método considera os minutos restantes e os converte em fração de horas.
     * @param dataInicial
     * @param dataFinal
     * @return quantidade de horas existentes entre a dataInicial e dataFinal.
     */
    public static double diferencaEmHoras(Date dataInicial, Date dataFinal) {
        double result = 0;
        long diferenca = dataFinal.getTime() - dataInicial.getTime();
        long diferencaEmHoras = (diferenca / 1000) / 60 / 60;
        long minutosRestantes = (diferenca / 1000) / 60 % 60;
        double horasRestantes = minutosRestantes / 60d;
        result = diferencaEmHoras + (horasRestantes);
        return result;
    }

    /**
     * Calcula a diferença de duas datas em minutos
     * <br>
     * <b>Importante:</b> Quando realiza a diferença em minutos entre duas datas, este método considera os segundos restantes e os converte em fração de minutos.
     * @param dataInicial
     * @param dataFinal
     * @return quantidade de minutos existentes entre a dataInicial e dataFinal.
     */
    public static double diferencaEmMinutos(Date dataInicial, Date dataFinal) {
        double result = 0;
        long diferenca = dataFinal.getTime() - dataInicial.getTime();
        double diferencaEmMinutos = (diferenca / 1000) / 60; //resultado é diferença entre as datas em minutos
        long segundosRestantes = (diferenca / 1000) % 60; //calcula os segundos restantes
        result = diferencaEmMinutos + (segundosRestantes / 60d); //transforma os segundos restantes em minutos
        return result;
    }

    public static String formatWithZero(Long value, int length) {
        String result = "";
        if (value != null && value >= 0) {
            result = value.toString();
            while (result.length() < length) {
                result = "0" + result;
            }
        }
        return result;
    }

    public static String getDateNow() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Date e = new Date();
        return sdf.format(e);
    }
    public static final int LINUX = 1;
    public static final int WINDOWS = 2;

    public static int getOperationSystem() {
        String so = System.getProperty("os.name");
        if (so.equalsIgnoreCase(("linux"))) {
            return LINUX;
        } else {
            return WINDOWS;
        }
    }

    public static boolean betweenDates(Date compareDate, Date startDate, Date endDate) {
        boolean result = false;
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        try {
            Calendar dataInicio = Calendar.getInstance();
            dataInicio.setTime(sdf.parse(sdf.format(startDate)));

            Calendar data = Calendar.getInstance();
            data.setTime(sdf.parse(sdf.format(compareDate)));


            Calendar dataFim = Calendar.getInstance();
            dataFim.setTime(sdf.parse(sdf.format(endDate)));

            if ((data.after(dataInicio) || data.equals(dataInicio)) && (data.before(dataFim) || data.equals(dataFim))) {
                result = true;
            }
        } catch (ParseException ex) {
            result = false;
        }
        return result;
    }

    public static String encrypt(String password) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            return new String(hexCodes(md.digest(password.getBytes())));
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Method used to transform a string of bytes in the format in an array of hexadecimal characters
     *
     * @param text
     * @return
     */
    private static char[] hexCodes(byte[] text) {
        char[] hexOutput = new char[text.length * 2];
        String hexString;
        for (int i = 0; i < text.length; i++) {
            hexString = "00" + Integer.toHexString(text[i]);
            hexString.getChars(hexString.length() - 2, hexString.length(), hexOutput, i * 2);
        }
        return hexOutput;
    }

    public static String dataPorExtenso(Date data) {
        String diaf = null;
        String mesf = null;
        String retorno = null;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(data);
        int semana = calendar.get(Calendar.DAY_OF_WEEK);
        int mes = calendar.get(Calendar.MONTH);
        int dia = calendar.get(Calendar.DAY_OF_MONTH);
        int ano = calendar.get(Calendar.YEAR);

        // semana
        switch (semana) {
            case 1: {
                diaf = "Domingo";
                break;
            }
            case 2: {
                diaf = "Segunda";
                break;
            }
            case 3: {
                diaf = "Terça";
                break;
            }
            case 4: {
                diaf = "Quarta";
                break;
            }
            case 5: {
                diaf = "Quinta";
                break;
            }
            case 6: {
                diaf = "Sexta";
                break;
            }
            case 7: {
                diaf = "Sábado";
                break;
            }
        }
        // mês
        switch (mes) {
            case 1: {
                mesf = "Janeiro";
                break;
            }
            case 2: {
                mesf = "Fevereiro";
                break;
            }
            case 3: {
                mesf = "Março";
                break;
            }
            case 4: {
                mesf = "Abril";
                break;
            }
            case 5: {
                mesf = "Maio";
                break;
            }
            case 6: {
                mesf = "Junho";
                break;
            }
            case 7: {
                mesf = "Julho";
                break;
            }
            case 8: {
                mesf = "Agosto";
                break;
            }
            case 9: {
                mesf = "Setembro";
                break;
            }
            case 10: {
                mesf = "Outubro";
                break;
            }
            case 11: {
                mesf = "Novembro";
                break;
            }
            case 12: {
                mesf = "Dezembro";
                break;
            }
        }
        retorno = dia + " de " + mesf + " de " + ano;
        return retorno;
    }

    public static String treatString(String string) {
        string = string.replaceAll("[ÂÀÁÄÃ]", "A");
        string = string.replaceAll("[âãàáä]", "a");
        string = string.replaceAll("[ÊÈÉË]", "E");
        string = string.replaceAll("[êèéë]", "e");
        string = string.replaceAll("[ÎÍÌÏ]", "I");
        string = string.replaceAll("[îíìï]", "i");
        string = string.replaceAll("[ÔÕÒÓÖ]", "O");
        string = string.replaceAll("[ôõòóö]", "o");
        string = string.replaceAll("[ÛÙÚÜ]", "U");
        string = string.replaceAll("[ûúùü]", "u");
        string = string.replaceAll("Ç", "C");
        string = string.replaceAll("ç", "c");
        string = string.replaceAll("[ýÿ]", "y");
        string = string.replaceAll("Ý", "Y");
        string = string.replaceAll("ñ", "n");
        string = string.replaceAll("Ñ", "N");
        string = string.replaceAll("['<>\\|/]", "");
        return string;
    }

    public static void main(String[] args) {
        List<String> sqlList = new ArrayList<String>();
        try {
            File inputWorkbook = new File("c:/gf.xls");
            Workbook w;
            try {
                w = Workbook.getWorkbook(inputWorkbook);
                Sheet sheet = w.getSheet(0);
                for (int i = 0; i < sheet.getRows(); i++) {
                    String sql = "";
                    sql += "insert into alimento (descricao, quantidade, carboidrato, proteina, lipidio, calcio, fosforo, ferro, sodio, vitaminaa, vitaminab1, vitaminab2, niacina, vitaminac, fibra, colesterol) values (";
                    for (int j = 0; j < sheet.getColumns(); j++) {
                        Cell cell = sheet.getCell(j, i);
                        String content = cell.getContents();
                        if (content == null || content.trim().length() == 0) {
                            content = "0";
                        }
                        if (j == 0) {
                            sql += "'" + treatString(content.toUpperCase()) + "'";
                        } else {
                            sql += "'" + treatString(content.replaceAll(",", ".")) + "'";
                        }
                        if (j < sheet.getColumns() - 1) {
                            sql += ", ";
                        }
                    }
                    sql += ");";
                    sqlList.add(sql);
                }
                /*
                for (int j = 0; j < sheet.getColumns(); j++) {
                for (int i = 0; i < sheet.getRows(); i++) {
                Cell cell = sheet.getCell(j, i);
                CellType type = cell.getType();
                if (cell.getType() == CellType.LABEL) {
                System.out.println("I got a label "
                + cell.getContents());
                }

                if (cell.getType() == CellType.NUMBER) {
                System.out.println("I got a number "
                + cell.getContents());
                }

                }
                }
                 */
            } catch (BiffException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (String s : sqlList) {
            System.out.println(s);
        }
    }
}
